001 /* 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: 2002-10-17 005 * Time: 17:11:15 006 * To change template for new class use 007 * Code Style | Class Templates options (Tools | IDE Options). 008 */ 009 package EVolve.util; 010 011 import EVolve.Scene; 012 import EVolve.visualization.AutoImage; 013 import javax.swing.*; 014 import java.util.*; 015 import java.awt.*; 016 import java.awt.event.*; 017 018 public class ThreadChooser{ 019 private ArrayList threadSet; 020 private HashMap imageMap,colorMap; 021 private JDialog dialog; 022 private JList threads; 023 private DefaultListModel threadListModel; 024 private AutoImage mergedImage; 025 private JComboBox comboThread; 026 private int [] indices; 027 private boolean multiChoice; 028 private String thread; 029 030 031 public ThreadChooser(HashMap imageMap,boolean multiChoice) { 032 this.imageMap = imageMap; 033 colorMap = new HashMap(); 034 this.multiChoice = multiChoice; 035 } 036 037 private String showMultiChoiceDialog() { 038 039 if (imageMap.size() == 0) return null; 040 dialog = new JDialog(Scene.getFrame(), "Choose thread & color to be visualized", true); 041 042 dialog.setBounds(new Rectangle(250,100)); 043 044 threadListModel = new DefaultListModel(); 045 threadSet = new ArrayList(); 046 threads = new JList(threadListModel); 047 Iterator it = imageMap.keySet().iterator(); 048 while (it.hasNext()) { 049 threadSet.add("Thread "+it.next()); 050 } 051 for (int i=0; i<threadSet.size(); i++) { 052 String item = (String)threadSet.get(i); 053 threadListModel.addElement(item); 054 } 055 dialog.getContentPane().add(threads,BorderLayout.CENTER); 056 057 JPanel panelButton = new JPanel(new FlowLayout()); 058 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH); 059 060 JButton buttonColor = new JButton("Coloring"); 061 buttonColor.addActionListener(new ActionListener() { 062 public void actionPerformed(ActionEvent e) { 063 selectColor(); 064 } 065 }); 066 panelButton.add(buttonColor); 067 068 JButton buttonOK = new JButton("OK"); 069 buttonOK.addActionListener(new ActionListener() { 070 public void actionPerformed(ActionEvent e) { 071 if (threads.getSelectedIndices().length == 0) { 072 Scene.showErrorMessage("You must choose at least one thread!"); 073 return; 074 } 075 indices = threads.getSelectedIndices(); 076 dialog.setVisible(false); 077 dialog = null; 078 } 079 }); 080 panelButton.add(buttonOK); 081 082 /*JButton buttonCancel = new JButton("Cancel"); 083 buttonCancel.addActionListener(new ActionListener() { 084 public void actionPerformed(ActionEvent e) { 085 dialog.setVisible(false); 086 } 087 }); 088 panelButton.add(buttonCancel);*/ 089 dialog.pack(); 090 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight()); 091 return null; 092 } 093 094 private String showSingleChoiceDialog() { 095 dialog = new JDialog(Scene.getFrame(), "Choose thread to be visualized", true); 096 097 Box boxMain = new Box(BoxLayout.Y_AXIS); 098 dialog.getContentPane().add(boxMain,BorderLayout.CENTER); 099 dialog.setBounds(new Rectangle(250,100)); 100 comboThread = new JComboBox(); 101 thread = null; 102 103 Iterator it = imageMap.keySet().iterator(); 104 while (it.hasNext()) { 105 comboThread.addItem("Thread "+it.next()); 106 } 107 boxMain.add(comboThread); 108 109 JPanel panelButton = new JPanel(new FlowLayout()); 110 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH); 111 112 JButton buttonOK = new JButton("OK"); 113 buttonOK.addActionListener(new ActionListener() { 114 public void actionPerformed(ActionEvent e) { 115 if (!validateThread()) 116 Scene.showErrorMessage("No data is available for this thread."); 117 else { 118 thread = (String)comboThread.getSelectedItem(); 119 dialog.setVisible(false); 120 } 121 } 122 }); 123 panelButton.add(buttonOK); 124 125 JButton buttonCancel = new JButton("Cancel"); 126 buttonCancel.addActionListener(new ActionListener() { 127 public void actionPerformed(ActionEvent e) { 128 dialog.setVisible(false); 129 } 130 }); 131 panelButton.add(buttonCancel); 132 dialog.pack(); 133 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight()); 134 135 dialog = null; 136 return thread; 137 } 138 139 public String showDialog() { 140 if (multiChoice) 141 return showMultiChoiceDialog(); 142 else 143 return showSingleChoiceDialog(); 144 } 145 146 private void selectColor() { 147 int index = threads.getSelectedIndex(); 148 149 if (index != -1) { 150 Color newColor = JColorChooser.showDialog(Scene.getFrame(), "Choose a color", Color.black); 151 if (newColor != null) { 152 colorMap.put(new Integer(index),newColor); 153 threadListModel.removeAllElements(); 154 155 for (int i=0; i<threadSet.size(); i++) { 156 if (colorMap.get(new Integer(i)) == null) 157 threadListModel.addElement(threadSet.get(i)); 158 else 159 threadListModel.addElement("<html><font color=#" + getColorHex((Color)colorMap.get(new Integer(i))) + ">" 160 + threadSet.get(i) +" </font></html>" ); 161 } 162 } 163 } 164 } 165 166 public AutoImage coloringImages(HashMap imageMap) { 167 mergedImage = new AutoImage(); 168 for (int i=0; i<indices.length; i++) { 169 Color newColor = (Color)colorMap.get(new Integer(indices[i])); 170 String threadId = (String)threadSet.get(indices[i]); 171 threadId = threadId.substring(7,threadId.length()); 172 AutoImage image = (AutoImage)imageMap.get(new Long(threadId)); 173 int w = image.getW(); 174 int h = image.getH(); 175 for (int j=0; j<w; j++) { 176 for (int k=0; k<h; k++) { 177 if (image.getColor(j,k) != null) 178 if (mergedImage.getColor(j,k) != null) 179 mergedImage.setColor(j,k,new Color(153,0,153)); 180 else 181 if (newColor != null) { 182 mergedImage.setColor(j,k,newColor); 183 } else mergedImage.setColor(j,k,image.getColor(j,k)); 184 } 185 } 186 187 } 188 return mergedImage; 189 } 190 191 private String getColorHex(Color color) { 192 String returnVal = Integer.toHexString(color.getBlue()); 193 if (returnVal.length() < 2) { 194 returnVal = "0" + returnVal; 195 } 196 returnVal = Integer.toHexString(color.getGreen()) + returnVal; 197 if (returnVal.length() < 4) { 198 returnVal = "0" + returnVal; 199 } 200 returnVal = Integer.toHexString(color.getRed()) + returnVal; 201 if (returnVal.length() < 6) { 202 returnVal = "0" + returnVal; 203 } 204 205 return returnVal; 206 } 207 208 public AutoImage getMergedImage() { 209 return mergedImage; 210 } 211 212 private boolean validateThread() { 213 AutoImage img; 214 215 String selected = (String)comboThread.getSelectedItem(); 216 img = (AutoImage)imageMap.get(new Long(selected.substring(7,selected.length()))); 217 if (img.getW()*img.getH() <= 0) return false; 218 219 return true; 220 } 221 222 223 }